package main

import "fmt"

// 方法

// 标识符:变量名 函数名 类型名 方法名
// Go语言中如果标识符首字母是大写的,就表示对外部包可见(暴露的, 公有的)

// Dog这是一个狗的结构体
// type Dog struct {
// 	name string
// }

// 结构体
// type dog struct {
// 	name string
// }

// // 构造函数
// func newDog(name string) dog {
// 	return dog{
// 		name: name,
// 	}
// }

// // 方法是作用于特定类型的函数
// // 接收着表示的是调用该方法的具体类型变量,多用类型名首字母小写表示
// func (d dog) wang() {
// 	fmt.Printf("%s:汪汪汪~", d.name)
// }

type cat struct {
	name string
	age  int
}

func newCat(name string, age int) cat {
	return cat{
		name: name,
		age:  age,
	}
}

// 什么时候应该使用指针类型接收者
// 1.需要修改接收者中的值
// 2.接收者是拷贝代价比较大的对象
// 3.保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者

// 使用值接收者:传拷贝进去
func (c cat) helloCat() {
	c.age++
	fmt.Println(c.name, c.age)
}

// 接收的是指针者
func (c *cat) guonian() {
	c.age++
}

func (c *cat) dream() {
	fmt.Println("你的梦想是什么:", c.name)
}
func main() {
	// d1 := newDog("zhoulin")
	// d1.wang()
	c1 := newCat("kity", 22)
	fmt.Println(c1.age)
	c1.helloCat()
	fmt.Println(c1.age)

	c1.guonian()
	// (&c1).guonian()
	fmt.Println(c1.age)
	c1.dream()
}
